#include <iostream>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
LL h[N], w[N];
LL n, k;

LL m = 1e12;
LL find(int x)
{
    LL ret = 0;
    for (int i = 1;i <= n;i++)
    {
        ret += (h[i] / x) * (w[i] / x);
    }
    //把块数和k进行比较
    if (ret > k) return -1;//切小了
    else if (ret == k) return 0;//合理范围
    else return 1;
}
int main()
{
    cin >> n >> k;
    for (int i = 1;i <= n;i++)
    {
        cin >> h[i] >> w[i];
        m = max(m, max(h[i], w[i]));
        //注意这个题得取所有的最长的，虽然都取最长得会导致有的根本就成不了块或者只能有一块，但是你想想一个问题，这个逆天人可能就一个朋友，所以说得拿最大的
    }
    LL l = 1;LL r = m;
    while (l < r)
    {
        //看看这个变长满足不满足
        int mid = (l + r+1) / 2;
        if (find(mid) <= 0) l= mid;
        else r = mid - 1;
    }
    cout << l << endl;
    return 0;
}